/*
 * ArbolBSharp.h
 *
 *  Created on: 10/09/2010
 *      Author: julfc
 */

#ifndef ARBOLBSHARP_H_
#define ARBOLBSHARP_H_

#include <string>
#include <iostream>
#include <vector>
#include "CabeceraBSharp.h"
#include "RegistroBSharp.h"
#include "NodoBSharp.h"
#include "Puntero.h"
#include "../moduloAlmacenamiento/ManejadorAccesoDatos.h"

using namespace std;

class ArbolBSharp {
private:
	static const char HIJO_IZQ;
	static const char HIJO_DER;

    static const long LONG_REGISTROS;
	static const long LONG_PUNTERO;

	static const long BLOQUE_CABECERA;
	static const long BLOQUE_RAIZ;

	static const long NUM_NODO_RAIZ;

	CabeceraBSharp cabecera;
	NodoBSharp raiz;
	void AgregarClaveOrdenada(NodoBSharp* nodo, RegistroBSharp registro);
	NodoBSharp CrearHijo(NodoBSharp padre, char lado);
	bool BuscarInterno(NodoBSharp nodo, long clave, Puntero* puntero, RegistroBSharp* registro);
	Puntero BuscarSiguiente(NodoBSharp nodo, long clave);
	void ReemplazarClave(long claveVieja, long claveNueva, Puntero puntero);
	void ReemplazarClaveGeneral(long claveVieja, long claveNueva);
	void Promover(vector<Puntero> camino, Puntero puntHijoNuevo, long clave);
	void Despromover(long claveAEliminar, vector<Puntero> camino);
	void GuardarCabecera();
	void RecuperarCabecera();
	bool EsPrimerHijo(NodoBSharp nodoPadre, NodoBSharp nodoHijo);
	bool EsUltimoHijo(NodoBSharp nodoPadre, NodoBSharp nodoHijo);

public:
    static const short NODO_RAIZ;
	static const short NODO_HOJA;
	static const short NODO_INDICE;

    static const long LONG_CLAVE;

	ArbolBSharp();
	char* fileName;
	void Crear(char* filePathName);
	void Abrir(char* filePathName);
	void InsertarRegistro(RegistroBSharp registro);
	bool ModificarRegistro(long clave, long valor);
	void EliminarRegistro(long clave);
	RegistroBSharp ObtenerRegistro(long clave);
	void Imprimir(Puntero puntero);
	vector<long> RecorrerOrdenado();

	virtual ~ArbolBSharp();
};

#endif /* ARBOLBSHARP_H_ */
